﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace iNet.Media.Video
{
	/// <summary>
	/// 影片中繼資料介面。
	/// </summary>
	public interface IVideoMetadata : IMetadata
	{
		/// <summary>
		/// 取得或設定影片建立年份。
		/// </summary>
		int? CreatedYear { get; set; }
		/// <summary>
		/// 取得或設定導演名稱。
		/// </summary>
		string[] Directors { get; set; }
		/// <summary>
		/// 取得或設定編碼者名稱。
		/// </summary>
		string Encoder { get; set; }
		/// <summary>
		/// 取得或設定演出者名稱。
		/// </summary>
		string[] Performers { get; set; }
		/// <summary>
		/// 取得或設定製作人名稱。
		/// </summary>
		string[] Producers { get; set; }
		/// <summary>
		/// 取得或設定發行者名稱。
		/// </summary>
		string Publisher { get; set; }
	}
	#region GenericVideoMetadata
	/// <summary>
	/// 無特定內部格式的影片中繼資料。
	/// </summary>
	public class GenericVideoMetadata : GenericMetadata, IVideoMetadata
	{
		#region 建構子
		/// <summary>
		/// 初始化新的 GenericMetadata 執行個體。
		/// </summary>
		public GenericVideoMetadata()
		{ }
		/// <summary>
		/// 初始化新的 GenericMetadata 執行個體。
		/// </summary>
		/// <param name="template">範本中繼資料。</param>
		/// <param name="isReadOnly">是否為唯讀。</param>
		public GenericVideoMetadata(IMetadata template, bool isReadOnly)
			: base(template, isReadOnly)
		{ }
		#endregion
		#region CopyFrom
		/// <summary>
		/// 從指定的中繼資料複製屬性。
		/// </summary>
		/// <param name="metadata">指定的中繼資料。</param>
		/// <exception cref="InvalidOperationException">中繼資料為唯讀。</exception>
		public override void CopyFrom(IMetadata metadata)
		{
			//呼叫基底
			base.CopyFrom(metadata);

			//複製中繼資料
			IVideoMetadata videoMetadata = (metadata as IVideoMetadata);
			if (videoMetadata != null)
			{
				this.Performers = videoMetadata.Performers;
			}
		}
		#endregion
		#region CreatedYear
		/// <summary>
		/// 取得或設定影片建立年份。
		/// </summary>
		public int? CreatedYear
		{
			get
			{
				return this.GetProperty<int?>("CreatedYear");
			}
			set
			{
				this.SetProperty("CreatedYear", value);
			}
		}
		#endregion
		#region Directors
		/// <summary>
		/// 取得或設定導演名稱。
		/// </summary>
		public string[] Directors
		{
			get
			{
				return this.GetProperty<string[]>("Directors");
			}
			set
			{
				this.SetProperty("Directors", value);
			}
		}
		#endregion
		#region Encoder
		/// <summary>
		/// 取得或設定編碼者名稱。
		/// </summary>
		public string Encoder
		{
			get
			{
				return this.GetProperty<string>("Encoder");
			}
			set
			{
				this.SetProperty("Encoder", value);
			}
		}
		#endregion
		#region Performers
		/// <summary>
		/// 取得或設定演出者名稱。
		/// </summary>
		public string[] Performers
		{
			get
			{
				return this.GetProperty<string[]>("Performers");
			}
			set
			{
				this.SetProperty("Performers", value);
			}
		}
		#endregion
		#region Producers
		/// <summary>
		/// 取得或設定製作人名稱。
		/// </summary>
		public string[] Producers
		{
			get
			{
				return this.GetProperty<string[]>("Producers");
			}
			set
			{
				this.SetProperty("Producers", value);
			}
		}
		#endregion
		#region Publisher
		/// <summary>
		/// 取得或設定發行者名稱。
		/// </summary>
		public string Publisher
		{
			get
			{
				return this.GetProperty<string>("Publisher");
			}
			set
			{
				this.SetProperty("Publisher", value);
			}
		}
		#endregion
	}
	#endregion
}
